在昨天 Multibranch Pipeline 的示範中,可以發現我們為了做測試環境是非常的煞費苦心,而且為了要做出 python 的 virtualenv,我們的 Jenkins agent 也必須先安裝對應的 python 版本,
例如: 我們想要有 python3.7.11 的虛擬環境,則 agent 就必須先安裝 python3.7.11,但是當我們有要測試 python3.8 時,則必須先額外裝 python3.8 ...... 老實說不是不可以,只是很容易一個不小心把整台 jenkins agent 安裝的亂七八糟的 QQ
所以今天我們要用更加彈性的方式來做我們的測試環境 - Docker Pipeline
pipeline{
    ......
        stage("Setup virtual env"){
            steps{
                sh '''#!/bin/bash
                virtualenv venv
                source venv/bin/activate
                pip3 install -r requirements.txt
                pip3 install pylint
                pip3 install pytest
                '''
            }
        }
        stage("Lint"){
            steps{
                sh '''
                source venv/bin/activate
                export PYTHONPATH=${PWD}
                pylint --fail-under=10 src
                '''
            }
        }
        stage("Test"){
            steps{
                sh '''
                source venv/bin/activate
                export PYTHONPATH=${PWD}
                pytest tests
                '''
            }
        }
    ......
}
在說到 Docker Pipeline 之前我們先來前情提要一下,在我們一般下的 docker 指令,其實我們是對他底層的 demaon unix:///var/run/docker.sock 進行操作,例如 docker ps => curl {{ DOCKER_HOST }}:2375/images/json
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-08-29 08:36:25 UTC; 3 weeks 0 days ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 18233 (dockerd)
      Tasks: 10
     Memory: 171.8M
     CGroup: /system.slice/docker.service
             └─18233 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
故一般我們在操作 docker 指令,就是和本地的 Daemon 去做交互行為。並且一般的 docker daemon 預設並不會公開給其他 server 使用,但是為了要讓我們實作遠端操作 docker daemon,接下來會教大家如何開啟 docker daemon 的 tcp 接口。
為了講解方便,故審略 security 的部分,故以下內容只建議在測試環境運行
sudo systemctl edit docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
sudo systemctl daemon-reload
systemctl restart docker
測試是否可以正常 requests 本地 docker daemon api。
進入 client 機 export DOCKER_HOST="tcp://{{ docker-cloud }}:4243",可以發現我們可以在 client 端用 docker images 正確提取遠端內容。
這裡的 Docker Host URI 我們可以想成是 export DOCKER_HOST ,所以在裡面輸入 tcp://{{ docker-cloud }}:4243,並設定對應 docker 最新API 版本號,參考設定如下:
備註:
Use this node as much as possible
範例用 Jenkinsfile
pipeline {
    agent none
    stages {
        stage('Build') {
            agent {
                docker { image 'gradle:6.7-jdk11' }
            }
            steps {
                sh 'gradle --version'
            }
        }
    }
}

在 Docker Pipeline 的加持之下,讓 Jenkins CI 的有了更多的可能性,明天我們將會重構 ithome-crawler 的 CI pipeline。
https://www.evanlin.com/til-docker-remote-api/
https://hackmd.io/@JYU/B1w9NDGnD